from mcp.server.fastmcp import FastMCP
import re
from typing import List, Tuple

# 创建 MCP 服务器实例
mcp = FastMCP("Calculator Server")

@mcp.tool()
def add(a: float, b: float) -> float:
    """加法运算：返回 a + b 的结果"""
    return a + b

@mcp.tool()
def subtract(a: float, b: float) -> float:
    """减法运算：返回 a - b 的结果"""
    return a - b

@mcp.tool()
def multiply(a: float, b: float) -> float:
    """乘法运算：返回 a * b 的结果"""
    return a * b

@mcp.tool()
def divide(a: float, b: float) -> float:
    """除法运算：返回 a / b 的结果，除数为零将抛出异常"""
    if b == 0:
        raise ValueError("除数不能为零")
    return a / b

@mcp.tool()
def calculate(expression: str) -> float:
    """复杂表达式计算，支持多个数字和运算优先级（先乘除后加减）
    示例: calculate("3 + 4 * 2 / (1 - 5)")
    """
    # 验证表达式安全性（仅允许数字和运算符）
    if not re.match(r'^[0-9+\-*/().\s]+$', expression):
        raise ValueError("表达式包含无效字符")

    try:
        # 使用 eval 计算表达式，已通过正则过滤确保安全
        result = eval(expression)
        return float(result)
    except ZeroDivisionError:
        raise ValueError("除数不能为零")
    except SyntaxError:
        raise ValueError("表达式语法错误")
    except Exception as e:
        raise ValueError(f"计算失败: {str(e)}")

if __name__ == "__main__":
    # 启动 MCP 服务（使用标准输入输出传输）
    mcp.run(transport="stdio")